// Copyright (C) 2024 wlly-lzh
// Created by wlly-lzh on 24-4-29
// Binary Tree  二叉树

#ifndef _BINTREE_H
#define _BINTREE_H

#include <stdbool.h>

typedef struct LBinTree LBinTree;
struct LBinTree;
LBinTree * Init_LBinTree();
// 初始化一个空树

LBinTree * Create_LBinTree(void * Data);
// 创建一个非空树

bool Assign_BinTree(LBinTree *Tree,char *Path,void *Data,
		void (*FreeData)(void *));
// 按照路径为树的结点赋值
// Path: "0110" 或 "/110"
// 1. 第一位的字符必须是 '0' 或 '/'，'/'表示根结点.
// 2. 从第二位开始，'0'表示右子树，'1'表示左子树.
// 3. Path 有多少个字符路径就有多少层.
// FreeData: 如果原结点存在数据，则使用该函数清除.

void PreOrderTraverse_LBinTree(LBinTree *Tree,
		void (*Vist)(void *,void*),void *V);
// 先序遍历
// Vist: 遍历函数，其第一个参数是树中存储的元素.
//       第二个参数是形参中的 V .

void InOrderTraverse_LBinTree(LBinTree *Tree,
		void (*Vist)(void *,void*),void *V);
// 中序遍历
// 使用方法同上(先序遍历)

void PostOrderTraverse_LBinTree(LBinTree *Tree,
		void (*Vist)(void *,void*),void *V);
// 后序遍历
// 使用方法同上(先序遍历)

void LevelOrderTraverse_LBinTree(LBinTree *Tree,
		void (*Vist)(void *,void*),void *V);
// 层次遍历
// 使用方法同上(先序遍历)

void Destroy_LBinTree(LBinTree **Tree,void (*FreeData)(void *));
// 销毁存储结构

void Clear_LBinTree(LBinTree *Tree,void (*FreeData)(void *));
// 清除除根结点以外的所有结点


#endif // _BINTREE_H
